package dbutils

import (
	"database/sql"
	"fmt"
	"os"
)

// ExecSqlScript 执行指定的SQL脚本文件并将其中的所有SQL语句应用到数据库中。
// 参数：
// - file: SQL脚本文件的路径，必须为有效的文件路径。
// - db: 数据库连接对象，用于执行SQL脚本。
// 返回值：
// - error: 如果在读取文件、开启事务、执行SQL或提交事务时发生错误，则返回对应的错误信息；否则返回nil。
func ExecSqlScript(file string, db *sql.DB) error {
	// 读取SQL文件内容
	sqlBytes, err := os.ReadFile(file)
	if err != nil {
		return err
	}

	// 开启数据库事务
	tx, err := db.Begin()
	if err != nil {
		return err
	}

	// 执行SQL脚本中的所有语句
	_, err = tx.Exec(string(sqlBytes))
	if err != nil {
		// 如果执行失败，打印错误信息并回滚事务
		fmt.Println("SQL file import failed:", err)
		err = tx.Rollback()
		if err != nil {
			return err
		}
	}

	// 提交事务以保存更改
	err = tx.Commit()
	if err != nil {
		return err
	}
	return nil
}
